/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package questao14;

import java.util.ArrayList;

/**
 *
 * @author SDKW
 */
public class ItemCalculadoraCaretaker {

    protected ArrayList<ItemCalculadoraMemento> estados;

    public ItemCalculadoraCaretaker() {
        estados = new ArrayList<ItemCalculadoraMemento>();
    }

    public void adicionarMemento(ItemCalculadoraMemento memento) {
        estados.add(memento);
    }

    public ItemCalculadoraMemento getUltimoEstadoSalvo() {
        if (estados.size() <= 0) {
            return new ItemCalculadoraMemento(null);
        }
        ItemCalculadoraMemento estadoSalvo = estados.get(estados.size() - 1);
        estados.remove(estados.size() - 1);
        System.out.println("Ultima instrução desfeita.");
        return estadoSalvo;
    }

    public String mostraExpressao() {
        String expressao = (estados.isEmpty()) ? "vazio" : estados.get(0).getOperacao();
        for (int i = 1; i < estados.size(); i++) {
            expressao += " " + estados.get(i).getOperacao();
        }
        return expressao;
    }

    public void validaExpressao() throws Exception {
        // proibe o inicio ou termino da expressão com um operador.
        if((estados.get(0).getItemCalculadora() instanceof Operador) 
            || (estados.get(estados.size()-1).getItemCalculadora() instanceof Operador)){
            throw new Exception("Expressão invalida com operadores no incio ou no final a expressão.");
        }        
        // verifica a sequencia de algorismo e um operador
        for (int i = 0; i < estados.size(); i++) {
            // posições pares sempre são dos algorismos
            if ((i % 2) == 0) {
                if (!(estados.get(i).getItemCalculadora() instanceof Algarismo)) {
                    throw new Exception("Expressão invalida com dois algorismos seguidos.");
                }
            }// posições impares sempre são dos operadores
            else {
                if (!(estados.get(i).getItemCalculadora() instanceof Operador)) {
                    throw new Exception("Expressão invalida com dois operadores seguidos.");
                }
            }
        }        
    }
}
